package camera

// CameraBaseInfo 相机基础信息
type CameraBaseInfo struct {
	// 相机ID【必填】
	ID int `json:"id"`
	// 相机本地编码【可选】
	LocationInfo string `json:"locationInfo,omitempty"`
	// 相机名称【可选】
	Name        string            `json:"name,omitempty"`
	SupportInfo CameraSupportInfo `json:"supportInfo,omitempty"`
	// 相机的支持（分辨率、帧率）信息列表【可选】
	SupportInfoList CameraSupportInfoList `json:"supportInfoList,omitempty"`
	// 相机路径【可选】
	SymbolicLink string `json:"symbolicLink,omitempty"`
}

func (p *CameraBaseInfo) Clone() *CameraBaseInfo {
	if p == nil {
		return nil
	}
	return &CameraBaseInfo{
		ID:              p.ID,
		Name:            p.Name,
		SymbolicLink:    p.SymbolicLink,
		LocationInfo:    p.LocationInfo,
		SupportInfoList: p.SupportInfoList.Clone(),
		SupportInfo:     *p.SupportInfo.Clone(),
	}
}

// CameraInfo 相机信息
type CameraInfo struct {
	//ID uint // 相机ID
	CameraBaseInfo
}

func (p *CameraInfo) Clone() *CameraInfo {
	if p == nil {
		return nil
	}
	return &CameraInfo{
		//ID:             p.ID,
		CameraBaseInfo: *p.CameraBaseInfo.Clone(),
	}
}

// CameraInfoList 相机信息列表
type CameraInfoList []*CameraInfo

func (s CameraInfoList) Clone() CameraInfoList {
	res := make(CameraInfoList, 0, len(s))
	for _, v := range s {
		res = append(res, v.Clone())
	}
	return res
}

func (s CameraInfoList) Get(id uint) (*CameraInfo, error) {
	// 遍历全部相机信息
	for _, item := range s {
		if item.ID != int(id) {
			continue
		}
		// 返回匹配到的相机
		return item.Clone(), nil
	}

	// 默认为找不到匹配的相机
	return nil, ErrNotFoundMatchCamera
}

func (s CameraInfoList) GetByUniqueFixedValue(val string) (*CameraInfo, error) {
	// 遍历全部相机信息
	for _, item := range s {
		if item.UniqueFixedValue() != val {
			continue
		}
		// 返回匹配到的相机
		return item.Clone(), nil
	}

	// 默认为找不到匹配的相机
	return nil, ErrNotFoundMatchCamera
}
